#include <gtest/gtest.h>
#include "PriorityQueue.hpp"
using namespace cr;

// TestCase 事件(即: 全局事件+TestSuite 事件)

class PriorityQueueTest : public testing::Test
{
public:
	static void SetUpTestCase() // 全局单元测试
	{
		// 处理全局的测试数据对象
		std::cout << "全局单元测试初始化" << std::endl;
	}

	virtual void SetUp() override // 独立单元测试
	{
		// 处理每个单元测试所需的独立数据对象（成员对象）
		std::cout << "当前单元测试初始化" << std::endl;
	}

	virtual void TearDown() override
	{
		std::cout << "当前单元测试环境释放" << std::endl;
	}

	static void TearDownTestCase()
	{
		std::cout << "全局单元测试释放" << std::endl;
	}

public:
};

TEST_F(PriorityQueueTest, construct)
{
	std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	PriorityQueue<int> priq(v.begin(), v.end());
	priq.print();
	std::cout << priq << std::endl;

	PriorityQueue<int> copy(priq);
	priq.print();
	std::cout << priq << std::endl;

	copy.pop();
	copy.pop();
	copy.pop();
	priq = copy;
	priq.print();
	std::cout << priq << std::endl;
}

TEST_F(PriorityQueueTest, deal_data)
{
	PriorityQueue<int> q1;
	q1.push(5);
	q1.push(1);
	q1.push(4);
	q1.push(2);
	q1.push(3);
	q1.push(6);
	ASSERT_EQ(q1.top(), 6);

	q1.pop();
	q1.pop();
	ASSERT_EQ(q1.top(), 4);

	std::vector<int> v{5, 1, 4, 2, 3, 6};
	auto comp = [](const int &x, const int &y) -> bool
	{ return x > y; };
	PriorityQueue<int, std::vector<int>, decltype(comp)> q2(v.begin(), v.end(), comp);
	ASSERT_EQ(q2.top(), 1);
	q2.pop();
	q2.pop();
	ASSERT_EQ(q2.top(), 3);
}

int main(int argc, char *argv[])
{
	testing::InitGoogleTest(&argc, argv);

	return RUN_ALL_TESTS();
}